import numpy as np
import matplotlib.pyplot as plt


def Open_Frame_IRV(inpath, frame, width, hight):  # 这一函数用于读取irv格式的红外视频AD值，传入视频地址、读取帧数、视频宽高。返回当前帧的AD值
    f = open(inpath, "rb")  # rb：也即 binary mode，read()操作返回的是bytes
    # frame  = 10   #irv：32*1024 视频的头，(640*480*2+1024) 一帧的长度
    f.seek(32 * 1024 + (frame - 1) * (hight * width * 2 + 1024), 0)  # 第一个代表需要移动偏移的字节数,0 代表从文件开头开始算起
    ccc = f.read(
        hight * width * 2)  # python在读取文件的时候是根据光标位置来读取的。读一行以后光标位置到了下一行。再来个read又到了下一行。 hight * width * 2是因为两个位内存存储一个ad值
    img = np.frombuffer(ccc,
                        dtype='uint16')  # read的数值以bytes的类型保存，通过np.frombuffer方法还原成类型为uint16的ndarray，这种方式还原出来的ndarray是只读的。
    img = img.reshape((hight, width))
    f.close()
    return img


def errorCorrection(arr):  # 这一函数用于纠正错误数据，有些差值过大的数据纠正为0
    for i in range(len(arr)):
        if arr[i] > 200:
            arr[i] = 0
    return arr


if __name__ == '__main__':  # 独立运行时测试用
    videos_path = r"E:\红外实验视频\0001.IRV"  # 原视频存放地址

    # 所计算的视频的起始帧数
    map_quantity_begin = 1
    # 所计算的视频的结束帧数
    map_quantity_end = 1058

    # 创建列表存储对应帧数视频图像
    lists_gray = []
    array_gray = []  # 存储图片序列
    y_average = []

    for k in range(map_quantity_begin, map_quantity_end):  # 读取map_quantity帧图片计算fft
        img = Open_Frame_IRV(videos_path, k, 640, 480)  # 读取红外AD值
        # 为列表赋值
        lists_gray.append(img)
    array_gray = np.array(lists_gray)  # 把lists_gray转换成np.array类型方便后续裁切

    # -------------------------------------------开始寻找最大值所对应的时间--------------------------------------------------

    # 确定横坐标
    x = np.linspace(1, map_quantity_end - map_quantity_begin, map_quantity_end - map_quantity_begin)

    # # 缺陷组一（左上）
    # iyd = 81  # 行
    # yd = 99
    # ixd = 191  # 列
    # xd = 207
    #
    # iyb = 32
    # yb = 46
    # ixb = 184
    # xb = 216

    # # 缺陷组二（左中）
    # iyd = 214
    # yd = 232
    # ixd = 171
    # xd = 188
    #
    # iyb = 159
    # yb = 178
    # ixb = 169
    # xb = 197

    # # 缺陷组三（左下）
    # iyd = 343
    # yd = 361
    # ixd = 157
    # xd = 172
    #
    # iyb = 287
    # yb = 301
    # ixb = 158
    # xb = 182

    # # 缺陷组一（中上）
    # iyd = 93  # 行
    # yd = 102
    # ixd = 288  # 列
    # xd = 299
    #
    # iyb = 44
    # yb = 59
    # ixb = 290
    # xb = 307

    # # 缺陷组二（中中）
    # iyd = 227
    # yd = 239
    # ixd = 271
    # xd = 284
    #
    # iyb = 176
    # yb = 191
    # ixb = 272
    # xb = 291

    # 缺陷组三（中下）
    iyd = 358
    yd = 375
    ixd = 246
    xd = 265

    iyb = 403
    yb = 421
    ixb = 233
    xb = 267



    # # 完整设备的数据
    # 缺陷组一（中上）
    # iyd = 95  # 行
    # yd = 107
    # ixd = 250  # 列
    # xd = 272
    #
    # iyb = 42
    # yb = 56
    # ixb = 243
    # xb = 276

    # # 缺陷组二（中中）
    # iyd = 238
    # yd = 254
    # ixd = 248
    # xd = 264
    #
    # iyb = 184
    # yb = 204
    # ixb = 243
    # xb = 268

    # # 缺陷组三（中下）
    # iyd = 386
    # yd = 398
    # ixd = 250
    # xd = 260
    #
    # iyb = 335
    # yb = 352
    # ixb = 240
    # xb = 264

    # 缺陷点AD值处理
    y_d = []
    y_b = []


    for i in range(len(array_gray)):
        y_d.append(np.nanmean(array_gray[i, iyd:yd, ixd:xd]))  # 使用append方法添加平均值到y_d列表
        y_b.append(np.nanmean(array_gray[i, iyb:yb, ixb:xb]))  # 使用append方法添加平均值到y_b列表

    plt.plot(x, y_d, color='g', label='defect')
    plt.plot(x, y_b, color='y', label='background')
    plt.title('AD value change trend')
    plt.xlabel('Frame')
    plt.ylabel('AD')
    plt.legend()
    plt.show()

    # 找到差值中的最大值
    dif = []
    for i in range(len(y_d)):
        # if i < 20:
        #     dif.append(1)
        # else:
            dif.append(abs(y_d[i] - y_b[i]))

    dif = errorCorrection(dif)
    print("差值最大值", max(dif))
    print(dif)
    # 找到最大值的位置
    t = dif == max(dif)
    w = np.where(t)
    print(w, "差值最大值是视频中的第", w[0] / 30, "秒")

    plt.plot(x, dif, color='r', label='dif')
    plt.title('AD dif change trend')
    plt.xlabel('Frame')
    plt.ylabel('AD')
    plt.legend()

    plt.show()
